home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / programer2 / pari2 / pari / c / mp < prev    next >
Text File  |  1991-12-14  |  36KB  |  1,884 lines

  1.  
  2. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  3. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  4. /*~                                    ~*/
  5. /*~               OPERATIONS DE BASE (NOYAU)            ~*/
  6. /*~                                    ~*/
  7. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  8. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  9.  
  10. # include "genpari.h"
  11.  
  12. GEN   mulsi(x,y)
  13.      long x;
  14.      GEN y;
  15. {
  16.   long s=signe(y),ly=lgef(y),i;
  17.   GEN z;
  18.   
  19.   if((!x)||(!s)) return gzero;
  20.   if(x<0) {s= -s;x= -x;}
  21.   z=cgeti(ly+1);hiremainder=0;
  22.   for(i=ly-1;i>=2;i--) z[i+1]=addmul(x,y[i]);
  23.   if(hiremainder) {z[2]=hiremainder;setlgef(z,ly+1);}
  24.   else {avma+=4;z[1]=z[0]-1;z++;setlgef(z,ly);}
  25.   setsigne(z,s);return z;
  26. }
  27.  
  28. GEN stoi(x)
  29.      long x;
  30. {
  31.   GEN y;
  32.   
  33.   if(!x) return gzero;
  34.   y=cgeti(3);
  35.   if(x>0) {y[1]=0x1000003;y[2]=x;}
  36.   else{y[1]=0xff000003;y[2]= -x;}
  37.   return y;
  38. }
  39.  
  40. GEN cgetg(x,y)
  41.      long x,y;
  42. {
  43.   unsigned long p1;
  44.   GEN z;
  45.   
  46.   p1=avma-(((unsigned short)x)<<2);
  47.   while(p1<bot) {allocatemoremem();p1=avma-(((unsigned short)x)<<2);}
  48.   avma=p1;z=(GEN)p1;z[0]=0x10000+x+(y<<24);
  49.   return z;
  50. }
  51.  
  52. GEN cgeti(x)
  53.      long x;
  54. {
  55.   unsigned long p1;
  56.   GEN z;
  57.   
  58.   p1=avma-(((unsigned short)x)<<2);
  59.   while(p1<bot) {allocatemoremem();p1=avma-(((unsigned short)x)<<2);}
  60.   avma=p1;z=(GEN)p1;z[0]=0x1010000+x;
  61.   return z;
  62. }
  63.  
  64. GEN cgetr(x)
  65.      long x;
  66. {
  67.   unsigned long p1;
  68.   GEN z;
  69.   
  70.   p1=avma-(((unsigned short)x)<<2);
  71.   while(p1<bot) {allocatemoremem();p1=avma-(((unsigned short)x)<<2);}
  72.   avma=p1;z=(GEN)p1;z[0]=0x2010000+x;
  73.   return z;
  74. }
  75.  
  76. GEN icopy(x)
  77.      GEN x;
  78. {
  79.   GEN y;
  80.   long lx=lgef(x),i;
  81.   
  82.   y=cgeti(lx);
  83.   for(i=1;i<lx;i++) y[i]=x[i];
  84.   return y;
  85. }
  86.  
  87. GEN rcopy(x)
  88.      GEN x;
  89. {
  90.   GEN y;
  91.   long lx=lg(x),i;
  92.   
  93.   y=cgetr(lx);
  94.   for(i=1;i<lx;i++) y[i]=x[i];
  95.   return y;
  96. }
  97.  
  98.  
  99. GEN negi(x)
  100.      GEN x;
  101. {
  102.   long s=signe(x);
  103.   GEN y;
  104.   
  105.   if(!s) return gzero;
  106.   y=icopy(x);setsigne(y,-s);
  107.   return y;
  108. }
  109.  
  110. GEN negr(x)
  111.      GEN x;
  112. {
  113.   GEN y;
  114.   
  115.   y=rcopy(x);setsigne(y,-signe(x));
  116.   return y;
  117. }
  118.  
  119.  
  120. GEN absi(x)
  121.      GEN x;
  122. {
  123.   GEN y;
  124.   long s=signe(x);
  125.   
  126.   if(!s) return gzero;
  127.   y=icopy(x);setsigne(y,1);return y;
  128. }
  129.  
  130. GEN absr(x)
  131.      GEN x;
  132. {
  133.   GEN y;
  134.   long s=signe(x);
  135.   
  136.   y=rcopy(x);
  137.   if(s) setsigne(y,1);
  138.   return y;
  139. }
  140.  
  141. int expi(x)
  142.      GEN x;
  143. {
  144.   long lx=x[1]&0xffff;
  145.   
  146.   return lx==2 ? -8388608 : ((lx-2)<<5)-bfffo(x[2])-1;
  147. }
  148.  
  149. long itos(x)
  150.      GEN x;
  151. {
  152.   long s=signe(x),p2;
  153.   unsigned long p1;
  154.   
  155.   if(!s) return 0;
  156.   if(lgef(x)>3) err(affer2);
  157.   p1=x[2];if(p1>=0x80000000) err(affer2);
  158.   p2=(s>0)?p1:(-((long)p1));return p2;
  159. }
  160.  
  161. void mpaff(x,y)
  162.      GEN x,y;
  163. {
  164.   long tx=typ(x),ty=typ(y);
  165.   if(tx==1)
  166.     {
  167.       if(ty==1) affii(x,y);else affir(x,y);
  168.     }
  169.   else
  170.     {
  171.       if(ty==1) affri(x,y);else affrr(x,y);
  172.     }
  173. }
  174.  
  175. void affsi(s,x)
  176.      long s;
  177.      GEN x;
  178. {
  179.   long lx;
  180.   
  181.   if(!s) {x[1]=2;return;}
  182.   lx=lg(x);if(lx<3) err(affer1);
  183.   if(s>0) {x[1]=0x1000003;x[2]=s;}
  184.   else {x[1]=0xff000003;x[2]= -s;}
  185. }
  186.  
  187. void affsr(s,x)
  188.      long s;
  189.      GEN x;
  190. {
  191.   long l,i,d;
  192.   
  193.   if(!s)
  194.     {
  195.       l=((x[0]&0xffff)-2)<<5;x[1]=0x800000-l;x[2]=0;
  196.     }
  197.   else
  198.     {
  199.       d=1;if(s<0) {d= -1;s= -s;}
  200.       l=bfffo(s);setexpo(x,31-l);setsigne(x,d);
  201.       x[2]=(s<<l);for(i=3;i<lg(x);i++) x[i]=0;
  202.     }
  203. }
  204.  
  205. void affii(x,y)
  206.      GEN x,y;
  207. {
  208.   long lx=lgef(x),i;
  209.   
  210.   if(x==y) return;
  211.   if(lg(y)<lx) err(affer3);
  212.   for(i=1;i<lx;i++) y[i]=x[i];
  213. }
  214.  
  215. void affir(x,y)
  216.      GEN x,y;
  217. {
  218.   long lx=lgef(x),ly=lg(y),s,i,l,k;
  219.   
  220.   s=signe(x);
  221.   if(!s)
  222.     {
  223.       y[1]=0x800000-((ly-2)<<5);y[2]=0;
  224.     }
  225.   else
  226.     {
  227.       setsigne(y,s);l=((x[1]&0xffff)-2)<<5;s=bfffo(x[2]);
  228.       if(s)
  229.     {
  230.       setexpo(y,l-s-1);
  231.       if(lx<=ly)
  232.         {
  233.           for(i=lx;i<ly;i++) y[i]=0;k=0;
  234.           for(i=lx-1;i>=2;i--) {y[i]=shiftl(x[i],s)+k;k=hiremainder;}
  235.         }
  236.       else
  237.         {
  238.           shiftl(x[ly],s);k=hiremainder;
  239.           for(i=ly-1;i>=2;i--) {y[i]=shiftl(x[i],s)+k;k=hiremainder;}
  240.         }
  241.     }
  242.       else
  243.     {
  244.       setexpo(y,l-1);
  245.       if(lx<=ly)
  246.         {
  247.           for(i=lx;i<ly;i++) y[i]=0;
  248.           for(i=lx-1;i>=2;i--) y[i]=x[i];
  249.         }
  250.       else for(i=ly-1;i>=2;i--) y[i]=x[i];
  251.     }
  252.     }
  253. }
  254.  
  255. void affrr(x,y)
  256.      GEN x,y;
  257. {
  258.   long lx=lg(x),ly=lg(y),i;
  259.   
  260.   if(x==y) return;
  261.   y[1]=x[1];
  262.   if(!(x[1]&0xff000000)) y[2]=0;
  263.   else
  264.     {
  265.       if(lx<=ly)
  266.     {
  267.       for(i=2;i<lx;i++) y[i]=x[i];
  268.       for(i=lx;i<ly;i++) y[i]=0;
  269.     }
  270.       else for(i=2;i<ly;i++) y[i]=x[i];
  271.     }
  272. }
  273.  
  274. GEN shifts(x,y)
  275.      long x,y;
  276. {
  277.   long t[3];
  278.   
  279.   if(!x) return gzero;
  280.   t[0]=0x1010003;
  281.   if(x>0) {t[1]=0x1000003;t[2]=x;}
  282.   else {t[1]=0xff000003;t[2]= -x;}
  283.   return shifti(t,y);
  284. }
  285.  
  286. GEN shifti(x,n)
  287.      GEN x;
  288.      long n;
  289. {
  290.   long lx=lgef(x),i,s=signe(x),d,m,p1,p2,k;
  291.   GEN y;
  292.   
  293.   if(!s) return gzero;
  294.   if(!n) return icopy(x);
  295.   if(n>0)
  296.     {
  297.       d=n>>5;m=n&31;
  298.       if(m)
  299.     {
  300.       p1=shiftl(x[2],m);p2=hiremainder;k=0;
  301.       if(p2)
  302.         {
  303.           y=cgeti(lx+d+1);for(i=lx+1;i<=lx+d;i++) y[i]=0;
  304.           for(i=lx;i>=4;i--) {y[i]=shiftl(x[i-1],m)+k;k=hiremainder;}
  305.           y[3]=p1+k;y[2]=p2;
  306.         }
  307.       else
  308.         {
  309.           y=cgeti(lx+d);for(i=lx;i<lx+d;i++) y[i]=0;
  310.           for(i=lx-1;i>=3;i--) {y[i]=shiftl(x[i],m)+k;k=hiremainder;}
  311.           y[2]=p1+k;
  312.         }
  313.     }
  314.       else
  315.     {
  316.       y=cgeti(lx+d);for(i=lx;i<lx+d;i++) y[i]=0;
  317.       for(i=lx-1;i>=2;i--) y[i]=x[i];
  318.     }
  319.     }
  320.   else
  321.     {
  322.       n= -n;d=n>>5;m=n&31;if(lx<d+3) return gzero;
  323.       if(!m)
  324.     {
  325.       y=cgeti(lx-d);for(i=2;i<lx-d;i++) y[i]=x[i];
  326.     }
  327.       else 
  328.     {
  329.       m=32-m;d++;
  330.       p1=shiftl(x[2],m);
  331.       if(hiremainder)
  332.         {
  333.           y=cgeti(lx-d+1);y[2]=hiremainder;
  334.           for(i=3;i<=lx-d;i++)
  335.         {
  336.           p2=shiftl(x[i],m);y[i]=p1+hiremainder;p1=p2;
  337.         }
  338.         }
  339.       else
  340.         {
  341.           if(lx==d+2) return gzero;
  342.           y=cgeti(lx-d);
  343.           for(i=3;i<=lx-d;i++) 
  344.         {
  345.           p2=shiftl(x[i],m);y[i-1]=p1+hiremainder;p1=p2;
  346.         }
  347.         }
  348.     }
  349.     }   
  350.   y[1]=y[0];setsigne(y,s);return y;
  351. }
  352.  
  353. GEN shiftr(x,n)
  354.      GEN x;
  355.      long n;
  356. {
  357.   long l;
  358.   GEN y;
  359.   
  360.   y=rcopy(x);l=expo(x)+n;
  361.   if(l>0x7fffff||l<-0x800000) err(shier2);
  362.   setexpo(y,l);return y;
  363. }
  364.  
  365. GEN mptrunc(x)
  366.      GEN x;
  367. {
  368.   long e,i,s,lx=lg(x),p1,p2,m;
  369.   unsigned long d;
  370.   GEN y;
  371.   
  372.   if(typ(x)==1) return icopy(x);
  373.   s=signe(x);if(!s) return gzero;
  374.   e=expo(x);if(e<0) return gzero;
  375.   d=e>>5;m=e&31;if(d>=lx-2) err(truer2);
  376.   y=cgeti(d+3);y[1]=y[0];setsigne(y,s);
  377.   if(m==31) for(i=2;i<=d+2;i++) y[i]=x[i];
  378.   else
  379.     {
  380.       m++;p1=0;
  381.       for(i=2;i<=d+2;i++)
  382.     {
  383.       p2=shiftl(x[i],m);y[i]=hiremainder+p1;p1=p2;
  384.     }
  385.     }
  386.   return y;
  387. }
  388.  
  389. GEN mpent(x)
  390.      GEN x;
  391. {
  392.   long e,i,lx=lg(x),m,f,p1,p2;
  393.   unsigned long d;
  394.   GEN y,z;
  395.   
  396.   if(typ(x)==1) return icopy(x);
  397.   if(signe(x)>=0) return mptrunc(x);
  398.   e=expo(x);if(e<0) {y=cgeti(3);y[2]=1;y[1]=0xff000003;return y;}
  399.   d=e>>5;m=e&31;if(d>=lx-2) err(truer2);
  400.   y=cgeti(d+3);y[1]=0xff000003+d;
  401.   if(m==31) 
  402.     {
  403.       for(i=2;i<=d+2;i++) y[i]=x[i];
  404.       while((i<lx)&&(!x[i])) i++;
  405.       f=(i<lx);
  406.     }    
  407.   else
  408.     {
  409.       m++;p1=0;
  410.       for(i=2;i<=d+2;i++)
  411.     {
  412.       p2=shiftl(x[i],m);y[i]=hiremainder+p1;p1=p2;
  413.     }
  414.       if(p1) f=1;
  415.       else
  416.     {
  417.       while((i<lx)&&(!x[i])) i++;
  418.       f=(i<lx);
  419.     }
  420.     }
  421.   if(f)
  422.     {
  423.       for(i=d+2;(i>=2)&&(y[i]==0xffffffff);i--) y[i]=0;
  424.       if(i>=2) y[i]++;
  425.       else
  426.     {
  427.       z=y;y=cgeti(1);*y=(*z)+1;y[1]=z[1]+1;
  428.     }
  429.     }
  430.   return y;
  431. }
  432.  
  433. int mpcmp(x,y)
  434.      GEN x,y;
  435. {
  436.   if(typ(x)==1) return (typ(y)==1) ? cmpii(x,y) : cmpir(x,y);
  437.   return (typ(y)==1) ? -cmpir(y,x) : cmprr(x,y);
  438. }
  439.  
  440. int cmpsi(x,y)
  441.      long x;
  442.      GEN y;
  443. {
  444.   ulong p;
  445.   
  446.   if(!x) return -signe(y);
  447.   if(x>0)
  448.     {
  449.       if(signe(y)<=0) return 1;
  450.       if(lgef(y)>3) return -1;
  451.       p=y[2];if(p==x) return 0;
  452.       return (p<(ulong)x) ? 1 : -1;
  453.     }
  454.   else
  455.     {
  456.       if(signe(y)>=0) return -1;
  457.       if(lgef(y)>3) return 1;
  458.       p=y[2];if(p== -x) return 0;
  459.       return (p<(ulong)(-x)) ? -1 : 1;
  460.     }
  461. }
  462.  
  463. int cmpsr(x,y)
  464.      long x;
  465.      GEN y;      
  466. {
  467.   int p;
  468.   long av;
  469.   GEN z;
  470.   
  471.   if(!x) return -signe(y);
  472.   av=avma;z=cgetr(3);affsr(x,z);
  473.   p=cmprr(z,y);avma=av;return p;
  474. }    
  475.  
  476. int cmpii(x,y)
  477.      GEN x,y;
  478. {
  479.   long sx=signe(x),sy=signe(y),lx,ly,i;
  480.   
  481.   if(sx<sy) return -1;
  482.   if(sx>sy) return 1;
  483.   if(!sx) return 0;
  484.   lx=lgef(x);ly=lgef(y);
  485.   if(lx>ly) return sx;
  486.   if(lx<ly) return -sx;
  487.   for(i=2;(i<lx)&&(x[i]==y[i]);i++);
  488.   if(i==lx) return 0;
  489.   return ((ulong)x[i]>(ulong)y[i]) ? sx : -sx;
  490. }
  491.  
  492. int cmpir(x,y)
  493.      GEN x,y;
  494. {
  495.   long av=avma;
  496.   int p;
  497.   GEN z;
  498.   
  499.   if(!signe(x)) return -signe(y);
  500.   z=cgetr(lg(y));affir(x,z);
  501.   p=cmprr(z,y);avma=av;return p;
  502. }
  503.  
  504. int cmprr(x,y)
  505.      GEN x,y;
  506. {
  507.   long sx=signe(x),sy=signe(y),ex,ey,lx,ly,lz,i;
  508.   
  509.   if(sx<sy) return -1;
  510.   if(sx>sy) return 1;
  511.   if(!sx) return 0;
  512.   ex=expo(x);ey=expo(y);
  513.   if(ex>ey) return sx;
  514.   if(ex<ey) return -sx;
  515.   lx=lg(x);ly=lg(y);lz=(lx<ly)?lx:ly;
  516.   for(i=2;(i<lz)&&(x[i]==y[i]);i++);
  517.   if(i<lz) return ((ulong)x[i]>(ulong)y[i]) ? sx : -sx;
  518.   if(lx>=ly)
  519.     {
  520.       while((i<lx)&(!x[i])) i++;
  521.       return (i==lx) ? 0 : sx;
  522.     }
  523.   else
  524.     {
  525.       while((i<ly)&(!y[i])) i++;
  526.       return (i==ly) ? 0 : -sx;
  527.     }
  528. }    
  529.  
  530. GEN mpadd(x,y)
  531.      GEN x,y;
  532. {
  533.   if(typ(x)==1) return (typ(y)==1) ? addii(x,y) : addir(x,y);
  534.   return (typ(y)==1) ? addir(y,x) : addrr(x,y);
  535. }
  536.  
  537. GEN addss(x,y)
  538.      long x,y;
  539. {
  540.   long t[3];
  541.   
  542.   if(!x) return stoi(y);
  543.   t[0]=0x1010003;
  544.   if(x>0) {t[1]=0x1000003;t[2]=x;} else {t[1]=0xff000003;t[2]= -x;}
  545.   return addsi(y,t);
  546. }
  547.  
  548.  
  549. GEN addsi(x,y)
  550.      long x;
  551.      GEN y;
  552. {
  553.   long sx,sy,ly,p,i;
  554.   GEN z;
  555.   
  556.   if(!x) return icopy(y);
  557.   sy=signe(y);if(!sy) return stoi(x);
  558.   if(x<0) {sx= -1;x= -x;} else sx=1;
  559.   ly=lgef(y);
  560.   if(sx==sy)
  561.     {
  562.       p=addll(x,y[ly-1]);
  563.       if(overflow)
  564.     {
  565.       z=cgeti(ly+1);z[ly]=p;
  566.       for(i=ly-1;(i>2)&&(y[i-1]==0xffffffff);i--) z[i]=0;
  567.       if(i>2)
  568.         {
  569.           z[i]=y[i-1]+1;i--;while(i>=3) {z[i]=y[i-1];i--;}
  570.           z[2]=z[1]=z[0]-1;z++;avma+=4;
  571.         }
  572.       else {z[2]=1;z[1]=z[0];}
  573.     }
  574.       else
  575.     {
  576.       z=cgeti(ly);z[ly-1]=p;for(i=1;i<ly-1;i++) z[i]=y[i];
  577.     }
  578.       setsigne(z,sx);
  579.     }
  580.   else
  581.     {
  582.       if(ly==3)
  583.     {
  584.       if((ulong)y[2]>(ulong)x)
  585.         {
  586.           z=cgeti(3);z[1]=(sy<<24)+3;z[2]=y[2]-x;return z;
  587.         }
  588.       if(y[2]==x) return gzero;
  589.       z=cgeti(3);z[1]=((-sy)<<24)+3;z[2]=x-y[2];return z;
  590.     }
  591.       p=subll(y[ly-1],x);
  592.       if(overflow)
  593.     {
  594.       z=cgeti(ly);z[ly-1]=p;
  595.       for(i=ly-2;!(y[i]);i--) z[i]=0xffffffff;
  596.       z[i]=y[i]-1;
  597.       if((i>2)||z[i]) {i--;for(;i>=1;i--) z[i]=y[i];}
  598.       else
  599.         {
  600.           z[2]=z[1]=z[0]-1;z++;avma+=4;setsigne(z,sy);
  601.         }
  602.     }
  603.       else
  604.     {
  605.       z=cgeti(ly);z[ly-1]=p;for(i=1;i<ly-1;i++) z[i]=y[i];
  606.     }    
  607.     }
  608.   return z;
  609. }
  610.  
  611. GEN addii(x,y)
  612.      GEN x,y;
  613. {
  614.   long sx=signe(x),sy=signe(y),sz,lx=lgef(x),ly=lgef(y),i,j,p;
  615.   GEN z;
  616.   
  617.   if(!sx) return icopy(y);
  618.   if(!sy) return icopy(x);
  619.   if(lx<ly) {z=x;x=y;y=z;sz=sx;sx=sy;sy=sz;sz=lx;lx=ly;ly=sz;}
  620.   if(sx==sy)
  621.     {
  622.       z=cgeti(lx+1);overflow=0;
  623.       for(i=ly-1,j=lx-1;i>=2;i--,j--) z[j+1]=addllx(x[j],y[i]);
  624.       if(overflow)
  625.     {
  626.       for(;(j>=2)&&(x[j]==0xffffffff);j--) z[j+1]=0;
  627.       if(j>=2)
  628.         {
  629.           z[j+1]=x[j]+1;j--;
  630.           for(;j>=2;j--) z[j+1]=x[j];
  631.           z[1]=z[0]-1;z[2]=x[1];z++;avma+=4;
  632.         }
  633.       else {z[2]=1;z[1]=x[1]+1;}
  634.     }
  635.       else
  636.     {
  637.       for(;j>=2;j--) z[j+1]=x[j];
  638.       z[1]=z[0]-1;z[2]=x[1];z++;avma+=4;
  639.     }
  640.     }
  641.   else
  642.     {
  643.       if(lx==ly)
  644.     {
  645.       setsigne(y,1);setsigne(x,1);p=cmpii(x,y);
  646.       setsigne(y,sy);setsigne(x,sx);if(!p) return gzero;
  647.       if(p<0) {z=x;x=y;y=z;sz=sx;sx=sy;sy=sz;}
  648.     }
  649.       z=cgeti(lx);overflow=0;
  650.       for(i=ly-1,j=lx-1;i>=2;i--,j--) z[j]=subllx(x[j],y[i]);
  651.       if(overflow)
  652.     {
  653.       for(;!(x[j]);j--) z[j]=0xffffffff;
  654.       z[j]=x[j]-1;j--;
  655.       for(;j>=2;j--) z[j]=x[j];
  656.     }
  657.       else
  658.     {
  659.       for(;j>=2;j--) z[j]=x[j];
  660.     }
  661.       if(z[2]) z[1]=x[1];
  662.       else
  663.     {
  664.       for(j=3;(j<lx)&&(!z[j]);j++);
  665.       i=j-2;z[i+1]=z[i]=z[0]-i;z+=i;avma+=(i<<2);setsigne(z,sx);
  666.     }
  667.     }
  668.   return z;
  669. }      
  670.  
  671. GEN addsr(x,y)
  672.      long x;
  673.      GEN y;
  674. {
  675.   long p[3];
  676.   
  677.   if(!x) return rcopy(y);
  678.   p[0]=0x1010003;
  679.   if(x>0) {p[1]=0x1000003;p[2]=x;} else {p[1]=0xff000003;p[2]= -x;}
  680.   return addir(p,y);
  681. }
  682.  
  683. GEN addir(x,y)
  684.      GEN x,y;
  685. {
  686.   long l,e,ly,av,i,l1;
  687.   GEN z;
  688.   
  689.   if(!signe(x)) return rcopy(y);
  690.   if(!signe(y))
  691.     {
  692.       l=lgef(x)-(expo(y)>>5);if((l<3)||(l>32767)) err(adder3);
  693.       z=cgetr(l);affir(x,z);return z;
  694.     }
  695.   else
  696.     {
  697.       e=expo(y)-expi(x);ly=lg(y);
  698.       if(e>0)
  699.     {
  700.       l=ly-(e>>5);if(l<=2) return rcopy(y);
  701.     }
  702.       else
  703.     { 
  704.       l=ly+((-e)>>5)+1;if(l>32767) err(adder3);
  705.     }
  706.       av=avma;z=cgetr(l);affir(x,z);l1=av-avma;l=l1>>2;
  707.       z=addrr(z,y);
  708.       for(i=lg(z)-1;i>=0;i--) z[i+l]=z[i];z+=l;avma+=l1;
  709.     }
  710.   return z;
  711. }
  712.  
  713. GEN addrr(x,y)
  714.      GEN x,y;
  715. {
  716.   long sx=signe(x),sy=signe(y),lx=lg(x),ly=lg(y),lz,ex=expo(x),ey=expo(y),sz;
  717.   long av0=avma,e,l,i,d,m,flag,lp1,lp2,av,k,j,cex,f2;
  718.   GEN z,p1,p2;
  719.   
  720.   if(!sy)
  721.     {
  722.       if(!sx) {e=(ex>=ey)?ex:ey;z=cgetr(3);z[2]=0;z[1]=e+0x800000;return z;}
  723.       e=ex-ey;
  724.       if(e<=0) {z=cgetr(3);z[2]=0;z[1]=ey+0x800000;return z;}
  725.       l=(e>>5)+3;if(l>lx) l=lx;z=cgetr(l);
  726.       for(i=1;i<l;i++) z[i]=x[i];return z;
  727.     }
  728.   e=ey-ex;
  729.   if(!sx)
  730.     {
  731.       if(e<=0) {z=cgetr(3);z[2]=0;z[1]=ex+0x800000;return z;}
  732.       l=(e>>5)+3;if(l>ly) l=ly;z=cgetr(l);
  733.       for(i=1;i<l;i++) z[i]=y[i];return z;
  734.     }
  735.   if(e)
  736.     {
  737.       if(e<0) {z=x;x=y;y=z;lz=lx;lx=ly;ly=lz;ey=ex;e= -e;sz=sx;sx=sy;sy=sz;}
  738.       d=e>>5;m=e&31;
  739.       if(d>=ly-2) return rcopy(y);
  740.       l=d+lx;
  741.       if(l>=ly)
  742.     {
  743.       flag=1;p1=cgetr(ly);lp1=ly;lp2=ly-d;
  744.     }
  745.       else
  746.     {
  747.       flag=0;p1=cgetr(l+1);lp2=lx+1;lp1=l+1;
  748.     }
  749.       av=avma;
  750.       if(m)
  751.     {
  752.       p2=cgetr(lp2);m=32-m;
  753.       if(flag) {shiftl(x[lp2-1],m);k=hiremainder;}
  754.       else k=0;
  755.       for(i=lp2-1;i>=3;i--) 
  756.         {
  757.           p2[i]=shiftl(x[i-1],m)+k;k=hiremainder;
  758.         }
  759.       p2[2]=k;
  760.     }
  761.       else p2=x;
  762.     }
  763.   else
  764.     {
  765.       l=(lx>ly)?ly:lx;p1=cgetr(l);av=avma;lp2=lp1=l;flag=2;p2=x;m=0;
  766.     }
  767.   if(sx==sy)
  768.     {
  769.       overflow=0;
  770.       if(m+flag) for(i=lp1-1,j=lp2-1;j>=2;i--,j--) p1[i]=addllx(p2[j],y[i]);
  771.       else 
  772.     {
  773.       p1[lp1-1]=y[lp1-1];
  774.       for(i=lp1-2,j=lp2-2;j>=2;i--,j--) p1[i]=addllx(p2[j],y[i]);
  775.     }
  776.       if(overflow)
  777.     {
  778.       for(;(i>=2)&&(y[i]==0xffffffff);i--) p1[i]=0;
  779.       if(i>=2) {cex=0;p1[i]=y[i]+1;while(i>=3) {i--;p1[i]=y[i];}}
  780.       else 
  781.         {
  782.           cex=1;k=0x80000000;if(ey==0x7fffff) err(adder4);
  783.           for(i=2;i<lp1;i++) {p1[i]=shiftlr(p1[i],1)+k;k=hiremainder;}
  784.         }
  785.     }
  786.       else {cex=0;for(;i>=2;i--) p1[i]=y[i];}
  787.       p1[1]=(sx<<24)+ey+cex+0x800000;
  788.       avma=av;return p1;
  789.     }
  790.   else 
  791.     {
  792.       if(!e) 
  793.     {
  794.       for(i=2;(i<l)&&(p2[i]==y[i]);i++);
  795.       if(i==l)
  796.         {
  797.           e=ex-((l-2)<<5)+0x800000;if(e<0) err(adder5);
  798.           if(e>=0x1000000) err(adder4);
  799.           avma=av0;z=cgetr(3);z[2]=0;z[1]=e;return z;
  800.         }
  801.       else
  802.         {
  803.           f2=(((ulong)y[i])>((ulong)p2[i]))?1:0;
  804.         }
  805.     }
  806.       else f2=1;
  807.       if(f2)
  808.     {
  809.       overflow=0;
  810.       if(m+flag) for(i=lp1-1,j=lp2-1;j>=2;i--,j--) p1[i]=subllx(y[i],p2[j]);
  811.       else 
  812.         {
  813.           p1[lp1-1]=y[lp1-1];
  814.           for(i=lp1-2,j=lp2-2;j>=2;i--,j--) p1[i]=subllx(y[i],p2[j]);
  815.         }
  816.       if(overflow)
  817.         {
  818.           for(;(i>=2)&&(!y[i]);i--) p1[i]=0xffffffff;
  819.           p1[i]=y[i]-1;while(i>=3) {i--;p1[i]=y[i];}
  820.         }
  821.       else for(;i>=2;i--) p1[i]=y[i];
  822.     }
  823.       else
  824.     {
  825.       overflow=0;
  826.       if(m+flag) for(i=lp1-1;i>=2;i--) p1[i]=subllx(p2[i],y[i]);
  827.       else 
  828.         {
  829.           p1[lp1-1]=subllx(0,y[lp1-1]);
  830.           for(i=lp1-2;i>=2;i--) p1[i]=subllx(p2[i],y[i]);
  831.         }
  832.     }
  833.       for(i=2;!p1[i];i++);j=i-2;avma=av+(j<<2);p1[j]=p1[0]-j;p1+=j;
  834.       m=bfffo(p1[2]);e=ey-(j<<5)-m+0x800000;
  835.       if(e<0) err(adder5);
  836.       p1[1]=f2 ? (sy<<24)+e : (sx<<24)+e;
  837.       if(m)
  838.     {
  839.       k=0;for(i=lp1-1-j;i>=2;i--) {p1[i]=shiftl(p1[i],m)+k;k=hiremainder;}
  840.     }
  841.       return p1;
  842.     }
  843. }
  844.  
  845. GEN mpsub(x,y)
  846.      GEN x,y;
  847. {
  848.   if(typ(x)==1) return (typ(y)==1) ? subii(x,y) : subir(x,y);
  849.   return (typ(y)==1) ? subri(x,y) : subrr(x,y);
  850. }
  851.  
  852. GEN subii(x,y)
  853.      GEN x,y;
  854. {
  855.   long s=signe(y);
  856.   GEN z;
  857.   
  858.   if(x==y) return gzero;
  859.   setsigne(y,-s);z=addii(x,y);setsigne(y,s);
  860.   return z;
  861. }
  862.  
  863. GEN subrr(x,y)
  864.      GEN x,y;
  865. {
  866.   long s=signe(y);
  867.   GEN z;
  868.   
  869.   if(x==y)
  870.     {
  871.       z=cgetr(3);z[2]=0;z[1]=0x800000-(lg(x)<<5);return z;
  872.     }
  873.   setsigne(y,-s);z=addrr(x,y);setsigne(y,s);return z;
  874. }
  875.  
  876. GEN subsi(x,y)
  877.      long x;
  878.      GEN y;
  879. {
  880.   long s=signe(y);
  881.   GEN z;
  882.   
  883.   setsigne(y,-s);z=addsi(x,y);setsigne(y,s);return z;
  884. }
  885.  
  886. GEN subsr(x,y)
  887.      long x;
  888.      GEN y;
  889. {
  890.   long s=signe(y);
  891.   GEN z;
  892.   
  893.   setsigne(y,-s);z=addsr(x,y);setsigne(y,s);return z;
  894. }
  895.  
  896. GEN subss(x,y)
  897.      long x,y;
  898. {
  899.   return addss(-y,x);
  900. }
  901.  
  902.  
  903. GEN subir(x,y)
  904.      GEN x,y;
  905. {
  906.   long s=signe(y);
  907.   GEN z;
  908.   
  909.   setsigne(y,-s);z=addir(x,y);setsigne(y,s);return z;
  910. }
  911.  
  912. GEN subri(x,y)
  913.      GEN x,y;
  914. {
  915.   long s=signe(y);
  916.   GEN z;
  917.   
  918.   setsigne(y,-s);z=addir(y,x);setsigne(y,s);return z;
  919. }
  920.  
  921. GEN mpmul(x,y)
  922.      GEN x,y;
  923. {
  924.   if(typ(x)==1) return (typ(y)==1) ? mulii(x,y) : mulir(x,y);
  925.   return (typ(y)==1) ? mulir(y,x) : mulrr(x,y);
  926. }
  927.  
  928. GEN mulss(x,y)
  929.      long x,y;
  930. {
  931.   long s,p1;
  932.   GEN z;
  933.   
  934.   if((!x)||(!y)) return gzero;
  935.   s=1;if(x<0) {s= -1;x= -x;} if(y<0) {s= -s;y= -y;}
  936.   p1=mulll(x,y);
  937.   if(hiremainder) {z=cgeti(4);z[2]=hiremainder;z[3]=p1;}
  938.   else {z=cgeti(3);z[2]=p1;}
  939.   z[1]=z[0];setsigne(z,s);return z;
  940. }
  941.  
  942. GEN mulsr(x,y)
  943.      long x;
  944.      GEN y;
  945. {
  946.   long lx,i,k,s,p1,p2,e;
  947.   GEN z;
  948.   
  949.   if(!x) return gzero;
  950.   s=signe(y);if(x<0) {s= -s;x= -x;}
  951.   if(!s)
  952.     {
  953.       p1=bfffo(x);e=y[1]+31-p1;if(e>=0x1000000) err(muler2);
  954.       z=cgetr(3);z[1]=e;z[2]=0;
  955.     }
  956.   else
  957.     {
  958.       if(x==1) {z=rcopy(y);setsigne(z,s);return z;}
  959.       lx=lg(y);z=cgetr(lx);setsigne(z,s);
  960.       p2=mulll(x,y[lx-1]);
  961.       for(i=lx-2;i>=2;i--) z[i+1]=addmul(x,y[i]);
  962.       z[2]=hiremainder;p1=bfffo(hiremainder);
  963.       if(p1)
  964.     {
  965.       shiftl(p2,p1);k=hiremainder;
  966.       for(i=lx-1;i>=2;i--)
  967.         {
  968.           z[i]=shiftl(z[i],p1)+k;k=hiremainder;
  969.         }
  970.     }
  971.       e=32-p1+expo(y);if(e>=0x800000) err(muler2);
  972.       setexpo(z,e);
  973.     }  
  974.   return z;
  975. }
  976.  
  977. GEN mulii(x,y)
  978.      GEN x,y;
  979. {
  980.   long i,j,lx=lgef(x),ly=lgef(y),sx,sy,lz,p1,p2;
  981.   GEN z;
  982.   
  983.   sx=signe(x);if(!sx) return gzero;
  984.   sy=signe(y);if(!sy) return gzero;
  985.   if(sy<0) sx= -sx;
  986.   if(lx>ly) {z=x;x=y;y=z;lz=lx;lx=ly;ly=lz;}
  987.   lz=lx+ly-2;if(lz>=0x10000) err(muler1);
  988.   z=cgeti(lz);z[1]=z[0];setsigne(z,sx);
  989.   p1=x[lx-1];hiremainder=0;
  990.   for(i=ly-1;i>=2;i--) z[lx+i-2]=addmul(p1,y[i]);
  991.   z[lx-1]=hiremainder;
  992.   for(j=lx-2;j>=2;j--)
  993.     {
  994.       p1=x[j];hiremainder=0;
  995.       for(i=ly-1;i>=2;i--)
  996.     {
  997.       p2=addmul(p1,y[i]);
  998.       z[i+j-1]=addll(p2,z[i+j-1]);hiremainder+=overflow;
  999.     }
  1000.       z[j]=hiremainder;
  1001.     }
  1002.   if(!(z[2]))
  1003.     {
  1004.       z[2]=z[1]-1;z[1]=z[0]-1;z++;avma+=4;
  1005.     }
  1006.   return z;
  1007. }
  1008.  
  1009. GEN mulrr(x,y)
  1010.      GEN x,y;
  1011. {
  1012.   long i,j,lx=lg(x),ly=lg(y),sx=signe(x),sy=signe(y),ex=expo(x),ey=expo(y);
  1013.   long e,flag,garde,p1,p2,lz;
  1014.   GEN z;
  1015.   
  1016.   e=ex+ey+0x800000;if(e>=0xffffff) err(muler4);
  1017.   if(e<0) err(muler5);
  1018.   if((!sx)||(!sy)) {z=cgetr(3);z[2]=0;z[1]=e;return z;}
  1019.   if(sy<0) sx= -sx;
  1020.   if(lx>ly) {lz=ly;z=x;x=y;y=z;flag=1;} else {lz=lx;flag=(lx!=ly);}
  1021.   z=cgetr(lz);z[1]=(sx<<24)+e;
  1022.   if(flag) mulll(x[2],y[lz]);else hiremainder=0;
  1023.   if(lz==3)
  1024.     {
  1025.       garde=flag ? addmul(x[2],y[2]) : mulll(x[2],y[2]);
  1026.       if((long)hiremainder<0) {z[2]=hiremainder;z[1]++;}
  1027.       else {z[2]=(garde<0)?(hiremainder<<1)+1:(hiremainder<<1);}
  1028.       return z;
  1029.     }
  1030.   p1=x[lz-1];garde=hiremainder;
  1031.   if(p1)
  1032.     {
  1033.       mulll(p1,y[3]);p2=addmul(p1,y[2]);
  1034.       garde=addll(p2,garde);z[lz-1]=overflow+hiremainder;
  1035.     }
  1036.   else z[lz-1]=0;
  1037.   for(j=lz-2;j>=3;j--)
  1038.     {
  1039.       p1=x[j];
  1040.       if(p1)
  1041.     {
  1042.       mulll(p1,y[lz+2-j]);
  1043.       p2=addmul(p1,y[lz+1-j]);
  1044.       garde=addll(p2,garde);hiremainder+=overflow;
  1045.       for(i=lz-j;i>=2;i--)
  1046.         {
  1047.           p2=addmul(p1,y[i]);
  1048.           z[i+j-1]=addll(p2,z[i+j-1]);hiremainder+=overflow;
  1049.         }
  1050.       z[j]=hiremainder;
  1051.     }
  1052.       else z[j]=0;
  1053.     }
  1054.   p1=x[2];p2=mulll(p1,y[lz-1]);
  1055.   garde=addll(p2,garde);hiremainder+=overflow;
  1056.   for(i=lz-2;i>=2;i--)
  1057.     {
  1058.       p2=addmul(p1,y[i]);
  1059.       z[i+1]=addll(p2,z[i+1]);hiremainder+=overflow;
  1060.     }
  1061.   z[2]=hiremainder;
  1062.   if((long)hiremainder>0)
  1063.     {
  1064.       overflow=(garde<0)?1:0;
  1065.       for(i=lz-1;i>=2;i--) {p1=z[i];z[i]=addllx(p1,p1);}
  1066.     }
  1067.   else z[1]++;
  1068.   return z;
  1069. }
  1070.  
  1071. GEN mulir(x,y)
  1072.      GEN x,y;
  1073. {
  1074.   long sx=signe(x),sy,av,lz,ey,e,garde,p1,p2,i,j;
  1075.   GEN z,temp;
  1076.   
  1077.   if(!sx) return gzero;
  1078.   sy=signe(y);ey=expo(y);
  1079.   if(!sy)
  1080.     {
  1081.       z=cgetr(3);z[2]=0;e=expi(x)+ey+0x800000;if(e>=0x1000000) err(muler6);
  1082.       z[1]=e;return z;
  1083.     }
  1084.   lz=lg(y);if(sy<0) sx= -sx;
  1085.   z=cgetr(lz);setsigne(z,sx);av=avma;
  1086.   temp=cgetr(lz+1);affir(x,temp);x=y;y=temp;
  1087.   e=expo(y)+ey+0x800000;if(e>=0xffffff) err(muler4);
  1088.   if(e<0) err(muler5);
  1089.   z[1]=(sx<<24)+e;
  1090.   mulll(x[2],y[lz]);
  1091.   if(lz==3)
  1092.     {
  1093.       garde=addmul(x[2],y[2]);
  1094.       if((long)hiremainder<0) {z[2]=hiremainder;z[1]++;}
  1095.       else {z[2]=(garde<0)?(hiremainder<<1)+1:(hiremainder<<1);}
  1096.       avma=av;return z;
  1097.     }
  1098.   garde=hiremainder;
  1099.   p1=x[lz-1];mulll(p1,y[3]);p2=addmul(p1,y[2]);
  1100.   garde=addll(p2,garde);z[lz-1]=overflow+hiremainder;
  1101.   for(j=lz-2;j>=3;j--)
  1102.     {
  1103.       p1=x[j];mulll(p1,y[lz+2-j]);
  1104.       p2=addmul(p1,y[lz+1-j]);
  1105.       garde=addll(p2,garde);hiremainder+=overflow;
  1106.       for(i=lz-j;i>=2;i--)
  1107.     {
  1108.       p2=addmul(p1,y[i]);
  1109.       z[i+j-1]=addll(p2,z[i+j-1]);hiremainder+=overflow;
  1110.     }
  1111.       z[j]=hiremainder;
  1112.     }
  1113.   p1=x[2];p2=mulll(p1,y[lz-1]);
  1114.   garde=addll(p2,garde);hiremainder+=overflow;
  1115.   for(i=lz-2;i>=2;i--)
  1116.     {
  1117.       p2=addmul(p1,y[i]);
  1118.       z[i+1]=addll(p2,z[i+1]);hiremainder+=overflow;
  1119.     }
  1120.   z[2]=hiremainder;
  1121.   if((long)hiremainder>0)
  1122.     {
  1123.       overflow=(garde<0)?1:0;
  1124.       for(i=lz-1;i>=2;i--) {p1=z[i];z[i]=addllx(p1,p1);}
  1125.     }
  1126.   else z[1]++;
  1127.   avma=av;return z;
  1128. }
  1129.  
  1130. GEN convi(x)
  1131.      GEN x;
  1132. {
  1133.   long lx,av=avma,lz;
  1134.   GEN z,p1,p2;  
  1135.   
  1136.   if(!signe(x))
  1137.     {
  1138.       z=cgeti(3);z[1]= -1;z[2]=0;avma=av;return z+3;
  1139.     }
  1140.   p1=absi(x);lx=lgef(p1);lz=((lx-2)*15)/14+3;z=cgeti(lz);z[1]= -1;
  1141.   for(p2=z+2;signe(p1);p2++) *p2=divisii(p1,1000000000,p1);
  1142.   avma=av;return p2;
  1143. }
  1144.  
  1145. GEN confrac(x)
  1146.      GEN x;
  1147. {
  1148.   long lx=lg(x),ex= -expo(x)-1,ex1,av=avma,ly,ey;
  1149.   long lr,nbdec,k,i,j;
  1150.   GEN y,res;
  1151.   
  1152.   ey=((lx-2)<<5)+ex;ly=(ey+63)>>5;y=cgeti(ly);ex1=ex>>5; /* 95 dans mp.s faux? */
  1153.   for(i=0;i<ex1;i++) y[i]=0;
  1154.   ex&=31;
  1155.   if(!ex) for(j=2;j<lx;j++) y[i++]=x[j];
  1156.   else
  1157.     {
  1158.       k=0;
  1159.       for(j=2;j<lx;j++) {y[i++]=shiftlr(x[j],ex)+k;k=hiremainder;}
  1160.       y[ly-2]=k;
  1161.     }
  1162.   y[ly-1]=0;
  1163.   nbdec=ey*0.30103+1;lr=(nbdec+17)/9;res=cgeti(lr);
  1164.   *res=nbdec;
  1165.   for(j=1;j<lr;j++)
  1166.     {
  1167.       hiremainder=0;
  1168.       for(i=ly-1;i>=0;i--) y[i]=addmul(y[i],1000000000);
  1169.       res[j]=hiremainder;
  1170.     }
  1171.   avma=av;return res;
  1172. }
  1173.  
  1174. void mulsii(x,y,z)
  1175.      long x;
  1176.      GEN y,z;
  1177. {
  1178.   long av=avma;
  1179.   GEN p1;
  1180.   
  1181.   p1=mulsi(x,y);affii(p1,z);avma=av;
  1182. }
  1183.  
  1184. void addsii(x,y,z)
  1185.      long x;
  1186.      GEN y,z;
  1187. {
  1188.   long av=avma;
  1189.   GEN p1;
  1190.   
  1191.   p1=addsi(x,y);affii(p1,z);avma=av;
  1192. }
  1193.  
  1194. long divisii(x,y,z)
  1195.      long y;
  1196.      GEN x,z;
  1197. {
  1198.   long av=avma,k;
  1199.   GEN p1;
  1200.   
  1201.   p1=divis(x,y);affii(p1,z);avma=av;
  1202.   k=hiremainder;return k;
  1203. }
  1204.  
  1205. long vals(x)
  1206.      long x;
  1207. {
  1208.   unsigned short int y,z;
  1209.   int s;
  1210.  
  1211.   if(!x) return -1;
  1212.   y=x;if(!y) {s=16;y=((ulong)x)>>16;} else s=0;
  1213.   z=y&255;if(!z) {s+=8;z=y>>8;}
  1214.   y=z&15;if(!y) {s+=4;y=z>>4;}
  1215.   z=y&3;if(!z) {s+=2;z=y>>2;}
  1216.   return (z&1) ? s : s+1;
  1217. }
  1218.  
  1219. long vali(x)
  1220.      GEN x;
  1221. {
  1222.   long i,lx=lgef(x);
  1223.   
  1224.   if(!signe(x)) return -1;
  1225.   for(i=lx-1;(i>=2)&&(!x[i]);i--);
  1226.   return ((lx-1-i)<<5)+vals(x[i]);
  1227. }
  1228.  
  1229. GEN mpdiv(x,y)
  1230.      GEN x,y;
  1231. {
  1232.   if(typ(x)==1) return (typ(y)==1) ? divii(x,y) : divir(x,y);
  1233.   return (typ(y)==1) ? divri(x,y) : divrr(x,y);
  1234. }
  1235.  
  1236. GEN divss(x,y)
  1237.      long x,y;
  1238. {
  1239.   long p1;
  1240.   
  1241.   if(!y) err(diver1);
  1242.   hiremainder=0;p1=divll((ulong)abs(x),(ulong)abs(y));
  1243.   if(y<0) {hiremainder= -((long)hiremainder);p1= -p1;}
  1244.   if(x<0) p1= -p1;
  1245.   return stoi(p1);
  1246. }
  1247.  
  1248. GEN modss(x,y)
  1249.      long x,y;
  1250. {
  1251.   long y1;
  1252.   
  1253.   if(!y) err(moder1);
  1254.   hiremainder=0;divll(abs(x),y1=abs(y));
  1255.   if(!hiremainder) return gzero;
  1256.   return (((long)hiremainder)<0) ? stoi(y1-hiremainder) : stoi(hiremainder);
  1257. }
  1258.  
  1259. GEN resss(x,y)
  1260.      long x,y;
  1261. {
  1262.   if(!y) err(reser1);
  1263.   hiremainder=0;divll(abs(x),abs(y));
  1264.   return (y<0) ? stoi(-((long)hiremainder)) : stoi(hiremainder);
  1265. }
  1266.  
  1267. GEN dvmdss(x,y,z)
  1268.      long x,y;
  1269.      GEN *z;
  1270. {
  1271.   GEN p1;
  1272.  
  1273.   p1=divss(x,y);*z=stoi(hiremainder);
  1274.   return p1;
  1275. }
  1276.  
  1277. void dvmdssz(x,y,z,t)
  1278.      long x,y;
  1279.      GEN z,t;
  1280. {
  1281.   long av=avma;
  1282.   GEN p1;
  1283.  
  1284.   p1=divss(x,y);affsi(hiremainder,t);
  1285.   mpaff(p1,z);avma=av;
  1286. }
  1287.  
  1288. GEN dvmdsi(x,y,z)
  1289.      long x;
  1290.      GEN y,*z;
  1291. {
  1292.   GEN p1;
  1293.   p1=divsi(x,y);*z=stoi(hiremainder);
  1294.   return p1;
  1295. }
  1296.  
  1297. void dvmdsiz(x,y,z,t)
  1298.      long x;
  1299.      GEN t,y,z;
  1300. {
  1301.   long av=avma;
  1302.   GEN p1;
  1303.   
  1304.   p1=divsi(x,y);affsi(hiremainder,t);
  1305.   mpaff(p1,z);avma=av;
  1306. }
  1307.  
  1308. GEN dvmdis(x,y,z)
  1309.      long y;
  1310.      GEN x,*z;
  1311. {
  1312.   GEN p1;
  1313.   p1=divis(x,y);*z=stoi(hiremainder);
  1314.   return p1;
  1315. }
  1316.  
  1317. void dvmdisz(x,y,z,t)
  1318.      long y;
  1319.      GEN x,t,z;
  1320. {
  1321.   long av=avma;
  1322.   GEN p1;
  1323.   
  1324.   p1=divis(x,y);affsi(hiremainder,t);
  1325.   mpaff(p1,z);avma=av;
  1326. }
  1327.  
  1328. void dvmdiiz(x,y,z,t)
  1329.      GEN x,y,z,t;
  1330. {
  1331.   long av=avma;
  1332.   GEN p1,p2;
  1333.  
  1334.   p1=dvmdii(x,y,&p2);mpaff(p1,z);mpaff(p2,t);
  1335.   avma=av;
  1336. }
  1337.  
  1338. GEN divsi(x,y)
  1339.      long x;
  1340.      GEN y;
  1341. {
  1342.   long s=signe(y),ly=lgef(y),p1;
  1343.  
  1344.   if(!s) err(diver2);
  1345.   if((!x)||(ly>3)||(y[2]<0)) {hiremainder=x;return gzero;}
  1346.   hiremainder=0;p1=divll(abs(x),y[2]);
  1347.   if(signe(y)<0) {hiremainder= -((long)hiremainder);p1= -p1;}
  1348.   if(x<0) p1= -p1;
  1349.   return stoi(p1);
  1350. }
  1351.  
  1352. GEN ressi(x,y)
  1353.      long x;
  1354.      GEN y;
  1355. {
  1356.   divsi(x,y);return stoi(hiremainder);
  1357. }
  1358.  
  1359. GEN modsi(x,y)
  1360.      long x;
  1361.      GEN y;
  1362. {
  1363.   long s;
  1364.   GEN p1;
  1365.   
  1366.   divsi(x,y);
  1367.   if(!hiremainder) return gzero;
  1368.   if(x>0) return stoi(hiremainder);
  1369.   else
  1370.     {
  1371.       s=signe(y);setsigne(y,1);p1=addsi(hiremainder,y);
  1372.       setsigne(y,s);return p1;
  1373.     }
  1374. }
  1375.  
  1376. GEN divis(y,x)
  1377.      long x;
  1378.      GEN y;
  1379. {
  1380.   long s=signe(y),ly=lgef(y),i,d;
  1381.   GEN z;
  1382.   
  1383.   if(!x) err(diver4);
  1384.   if(!s) {hiremainder=0;return gzero;}
  1385.   if(x<0) {s= -s;x= -x;} 
  1386.   if((ulong)x>(ulong)y[2])
  1387.     {
  1388.       if(ly==3) {hiremainder=itos(y);return gzero;}
  1389.       else {z=cgeti(ly-1);d=1;hiremainder=y[2];}
  1390.     }
  1391.   else {z=cgeti(ly);d=0;hiremainder=0;}
  1392.   for(i=d+2;i<ly;i++) z[i-d]=divll(y[i],x);
  1393.   z[1]=z[0];setsigne(z,s);if(s<0) hiremainder= -((long)hiremainder);
  1394.   return z;
  1395. }
  1396.  
  1397. GEN modis(x,y)
  1398.      long y;
  1399.      GEN x;
  1400. {
  1401.   divis(x,y);if(!hiremainder) return gzero;
  1402.   return (signe(x)>0) ? stoi(hiremainder) : stoi(abs(y)+hiremainder);
  1403. }
  1404.  
  1405. GEN resis(x,y)
  1406.      long y;
  1407.      GEN x;
  1408. {
  1409.   divis(x,y);return stoi(hiremainder);
  1410. }
  1411.      
  1412. void divisz(x,y,z)
  1413.      long y;
  1414.      GEN x,z;
  1415. {
  1416.   long av=avma;
  1417.   GEN p1;
  1418.   
  1419.   if(typ(z)==1) gops2gsz(divis,x,y,z);
  1420.   else
  1421.     {
  1422.       p1=cgetr(lg(z));affir(x,p1);p1=divrs(p1,y);
  1423.       affrr(p1,z);avma=av;
  1424.     }
  1425. }
  1426.  
  1427. void divsiz(x,y,z)
  1428.      long x;
  1429.      GEN y,z;
  1430. {
  1431.   long av=avma,lz;
  1432.   GEN p1,p2;
  1433.   
  1434.   if(typ(z)==1) gops2sgz(divsi,x,y,z);
  1435.   else
  1436.     {
  1437.       lz=lg(z);p1=cgetr(lz);p2=cgetr(lz);affsr(x,p1);affir(y,p2);
  1438.       p1=divrr(p1,p2);affrr(p1,z);avma=av;
  1439.     }
  1440. }
  1441.  
  1442. void divssz(x,y,z)
  1443.      long x,y;
  1444.      GEN z;
  1445. {
  1446.   long av=avma;
  1447.   GEN p1;
  1448.   
  1449.   if(typ(z)==1) gops2ssz(divss,x,y,z);
  1450.   else
  1451.     {
  1452.       p1=cgetr(lg(z));affsr(x,p1);p1=divrs(p1,y);
  1453.       affrr(p1,z);avma=av;
  1454.     }
  1455. }
  1456.  
  1457. GEN divir(x,y)
  1458.      GEN x,y;
  1459. {
  1460.   GEN xr,z;
  1461.   long av,ly;
  1462.   
  1463.   if(!signe(y)) err(diver5);
  1464.   if(!signe(x)) return gzero;
  1465.   ly=lg(y);z=cgetr(ly);av=avma;affir(x,xr=cgetr(ly+1));
  1466.   xr=divrr(xr,y);affrr(xr,z);avma=av;return z;
  1467. }
  1468.  
  1469. GEN divri(x,y)
  1470.      GEN x,y;
  1471.  
  1472. {
  1473.   GEN yr,z;
  1474.   long av,lx,ex,s=signe(y);
  1475.  
  1476.   if(!s) err(diver8);
  1477.   if(!signe(x))
  1478.   {
  1479.     ex=expo(x)-expi(y)+0x800000;
  1480.     if(ex<0) err(diver12);
  1481.     z=cgetr(3);z[1]=ex;z[2]=0;return z;
  1482.   }
  1483.   if((lg(y)==3)&&(y[2]>0)) return (s>0) ? divrs(x,y[2]) : divrs(x,-y[2]);
  1484.   lx=lg(x);z=cgetr(lx);av=avma;affir(y,yr=cgetr(lx+1));
  1485.   yr=divrr(x,yr);affrr(yr,z);avma=av;return z;
  1486. }
  1487.  
  1488. void diviiz(x,y,z)
  1489.      GEN x,y,z;
  1490. {
  1491.   long av=avma,lz;
  1492.   GEN p1,p2;
  1493.   
  1494.   if(typ(z)==1) {p1=divii(x,y);affii(p1,z);avma=av;}
  1495.   else
  1496.     {
  1497.       lz=lg(z);p1=cgetr(lz);p2=cgetr(lz);affir(x,p1);affir(y,p2);
  1498.       p1=divrr(p1,p2);affrr(p1,z);avma=av;
  1499.     }
  1500. }
  1501.      
  1502. void divrrz(x,y,z)
  1503.      GEN x,y,z;
  1504. {
  1505.   long av=avma;
  1506.   GEN p1;
  1507.  
  1508.   p1=divrr(x,y);mpaff(p1,z);avma=av;
  1509. }
  1510.  
  1511. void mpdivz(x,y,z)
  1512.      GEN x,y,z;
  1513. {
  1514.   long av=avma,lz;
  1515.   GEN p1,p2;
  1516.  
  1517.   if(typ(z)==1)
  1518.     {
  1519.       if(typ(x)==2||typ(y)==2) err(divzer1);
  1520.       p1=divii(x,y);affii(p1,z);avma=av;
  1521.     }
  1522.   else
  1523.     {
  1524.       if(typ(x)==1)
  1525.     {
  1526.       if(typ(y)==2) {p1=divir(x,y);mpaff(p1,z);avma=av;}
  1527.       else
  1528.         {
  1529.           lz=lg(z);p1=cgetr(lz);p2=cgetr(lz);affir(x,p1);affir(y,p2);
  1530.           p1=divrr(p1,p2);affrr(p1,z);avma=av;
  1531.         }
  1532.     }
  1533.       else
  1534.     {
  1535.       if(typ(y)==2) {p1=divrr(x,y);affrr(p1,z);avma=av;}
  1536.       else {p1=divri(x,y);affrr(p1,z);avma=av;}
  1537.     }
  1538.     }
  1539. }
  1540.  
  1541. GEN divsr(x,y)
  1542.      long x;
  1543.      GEN y;
  1544. {
  1545.   long av,ly;
  1546.   GEN p1,z;
  1547.  
  1548.   if(!signe(y)) err(diver3);
  1549.   if(!x) return gzero;
  1550.   ly=lg(y);z=cgetr(ly);av=avma;p1=cgetr(ly+1);affsr(x,p1);p1=divrr(p1,y);
  1551.   affrr(p1,z);avma=av;return z;
  1552. }
  1553.  
  1554. GEN modii(x,y)
  1555.      GEN x,y;
  1556. {
  1557.   long av=avma,tetpil;
  1558.   GEN p1;
  1559.  
  1560.   p1=dvmdii(x,y,-1);
  1561.   if(signe(p1)>=0) return p1;
  1562.   tetpil=avma;p1=(signe(y)>0) ? addii(p1,y) : subii(p1,y);
  1563.   return gerepile(av,tetpil,p1);
  1564. }
  1565.  
  1566. void modiiz(x,y,z)
  1567.      GEN x,y,z;
  1568. {
  1569.   long av=avma;
  1570.   GEN p1;
  1571.  
  1572.   p1=modii(x,y);affii(p1,z);avma=av;
  1573. }
  1574.  
  1575. void resiiz(x,y,z)
  1576.      GEN x,y,z;
  1577. {
  1578.   long av=avma;
  1579.   GEN p1;
  1580.  
  1581.   p1=resii(x,y);affii(p1,z);avma=av;
  1582. }
  1583.  
  1584. GEN divrs(x,y)
  1585.      long y;
  1586.      GEN x;
  1587. {
  1588.   long i,k,lx,ex,garde,sh,s=signe(x);
  1589.   GEN z;
  1590.  
  1591.   if(!y) err(diver6);
  1592.   if(!s)
  1593.     {
  1594.       z=cgetr(3);z[2]=0;z[1]=x[1]-31+bfffo(y);
  1595.       if(z[1]<0) err(diver7);return z;
  1596.     }
  1597.   if(y<0) {s= -s;y= -y;}
  1598.   if(y==1) {z=rcopy(x);setsigne(z,s);return z;}
  1599.   z=cgetr(lx=lg(x));setsigne(z,s);hiremainder=0;
  1600.   for(i=2;i<lx;i++) z[i]=divll(x[i],y);
  1601.   garde=divll(0,y);sh=bfffo(z[2]);ex=expo(x)-sh;if((-ex)>0x800000) err(diver7);
  1602.   setexpo(z,ex);shiftl(garde,sh);k=hiremainder;
  1603.   for(i=lx-1;i>=2;i--) {z[i]=shiftl(z[i],sh)+k;k=hiremainder;}
  1604.   return z;
  1605. }
  1606.  
  1607. mpdivis(x,y,z)
  1608.      GEN x,y,z;
  1609. {
  1610.   long av=avma;
  1611.   GEN p1,p2;
  1612.  
  1613.   p1=dvmdii(x,y,&p2);
  1614.   if(signe(p2)) {avma=av;return 0;}
  1615.   affii(p1,z);avma=av;return 1;
  1616. }
  1617.  
  1618. divise(x,y)
  1619.      GEN x,y;
  1620. {
  1621.   long av=avma;
  1622.   GEN p1;
  1623.  
  1624.   p1=dvmdii(x,y,-1);avma=av;
  1625.   return signe(p1) ? 0 : 1;
  1626. }
  1627.  
  1628.  
  1629. GEN dvmdii(x,y,z)
  1630.      GEN x,y,*z;
  1631. {
  1632.   long av,av2,lx,ly,lz,i,j,dec,sh,k,k1,sx=signe(x),sy=signe(y);
  1633.   long saux,k3,k4,av1,flk4;
  1634.   ulong si,qp;
  1635.   GEN p1,p2,p3,p4;
  1636.   
  1637.   if(!sy) err(dvmer1);
  1638.   if(!sx)
  1639.     {
  1640.       if(((long)z==0xffffffff)||((long)z==0)) return gzero;
  1641.       *z=gzero;return gzero;
  1642.     }
  1643.   lx=lgef(x);ly=lgef(y);lz=lx-ly;
  1644.   if(lz<0)
  1645.     {
  1646.       if((long)z==0xffffffff) return icopy(x);
  1647.       if(z==0) return gzero;
  1648.       *z=icopy(x);return gzero;
  1649.     }
  1650.   av=avma;if(sx<0) sy= -sy;
  1651.   if(ly==3)
  1652.     {
  1653.       si=y[2];
  1654.       if(si>(ulong)x[2]) {p1=cgeti(lx-1);hiremainder=x[2];dec=1;}
  1655.       else {p1=cgeti(lx);hiremainder=0;dec=0;}
  1656.       for(i=2+dec;i<lx;i++) p1[i-dec]=divll(x[i],si);
  1657.       if((long)z==0xffffffff)
  1658.     {
  1659.       avma=av;if(!hiremainder) return gzero;
  1660.       p2=cgeti(3);p2[1]=(sx<<24)+3;p2[2]=hiremainder;return p2;
  1661.     }
  1662.       if(lx!=(dec+2)) {p1[1]=p1[0];setsigne(p1,sy);} else {avma=av;p1=gzero;}
  1663.       if(z==0) return p1;
  1664.       if(!hiremainder) *z=gzero;
  1665.       else {p2=cgeti(3);p2[1]=(sx<<24)+3;p2[2]=hiremainder;*z=p2;}
  1666.       return p1;
  1667.     }
  1668.   else
  1669.     {
  1670.       p1=cgeti(lx);
  1671.       sh=bfffo(y[2]);
  1672.       if(sh)
  1673.     {
  1674.       p2=cgeti(ly);k=shiftl(y[2],sh);
  1675.       for(i=3;i<ly;i++) 
  1676.         {
  1677.           k1=shiftl(y[i],sh);p2[i-1]=k+hiremainder;k=k1;
  1678.         }
  1679.       p2[ly-1]=k;k=0;
  1680.       for(i=2;i<lx;i++)
  1681.         {
  1682.           k1=shiftl(x[i],sh);p1[i-1]=k+hiremainder;k=k1;
  1683.         }
  1684.       p1[lx-1]=k;
  1685.     }
  1686.       else {p1[1]=0;for(j=2;j<lx;j++) p1[j]=x[j];p2=y;}
  1687.       si=p2[2];saux=p2[3];
  1688.       for(i=1;i<=lz+1;i++)
  1689.     {
  1690.       if(p1[i]==si) 
  1691.         {
  1692.           qp=0xffffffff;k=addll(si,p1[i+1]);
  1693.         }
  1694.       else
  1695.         {
  1696.           hiremainder=p1[i];qp=divll(p1[i+1],si);
  1697.           overflow=0;k=hiremainder;
  1698.         }
  1699.       if(!overflow)
  1700.         {
  1701.           k1=mulll(qp,saux);k3=subll(k1,p1[i+2]);k+=overflow;
  1702.           flk4=((ulong)hiremainder>(ulong)k);k4=subll(hiremainder,k);
  1703.           while(flk4) {qp--;k3=subll(k3,saux);k4-=overflow;flk4=((ulong)k4>(ulong)si);k4=subll(k4,si);}
  1704.         }
  1705.       hiremainder=0;
  1706.       for(j=ly-1;j>=2;j--)
  1707.         {
  1708.           k1=addmul(qp,p2[j]);
  1709.           p1[i+j-1]=subll(p1[i+j-1],k1);hiremainder+=overflow;
  1710.         }
  1711.       if((ulong)p1[i]<(ulong)hiremainder)
  1712.         {
  1713.           overflow=0;qp--;
  1714.           for(j=ly-1;j>=2;j--) p1[i+j-1]=addllx(p1[i+j-1],p2[j]);
  1715.         }
  1716.       p1[i]=qp;
  1717.     }
  1718.       av1=avma;
  1719.       if((long)z!=0xffffffff)
  1720.     {
  1721.       if(p1[1])
  1722.         {
  1723.           p3=cgeti(lz+3);for(j=2;j<=lz+2;j++) p3[j]=p1[j-1];
  1724.         }
  1725.       else
  1726.         {
  1727.           p3=cgeti(lz+2);
  1728.           if(!lz) sy=0;else for(j=2;j<=lz+1;j++) p3[j]=p1[j];
  1729.         }
  1730.       if(lg(p3)<3) p3[1]=2;else {p3[1]=p3[0];setsigne(p3,sy);}
  1731.     }
  1732.       if(z!=0)
  1733.     {
  1734.       for(j=lz+2;(j<lx)&&(!p1[j]);j++);
  1735.       if(j==lx) p4=gzero;
  1736.       else
  1737.         {
  1738.           p4=cgeti(lx-j+2);p4[1]=p4[0];
  1739.           if(!sh) for(i=2;j<lx;j++,i++) p4[i]=p1[j];
  1740.           else
  1741.         {
  1742.           hiremainder=0;k1=shiftlr(p1[j++],sh);k=hiremainder;
  1743.           if(k1) {p4[2]=k1;dec=1;} else {p4[1]=p4[0]-1;p4++;avma+=4;p4[1]=p4[0];dec=0;}
  1744.           for(i=2+dec;j<lx;j++,i++)
  1745.             {
  1746.               p4[i]=shiftlr(p1[j],sh)+k;k=hiremainder;
  1747.             }
  1748.         }
  1749.           setsigne(p4,sx);
  1750.         }
  1751.     }
  1752.       if((long)z==0xffffffff) return gerepile(av,av1,p4);
  1753.       if((long)z==0) return gerepile(av,av1,p3);
  1754.       av2=avma;dec=lpile(av,av1,0)>>2;*z=adecaler(p4,av1,av2)?p4+dec:p4;
  1755.       return adecaler(p3,av1,av2)?p3+dec:p3;
  1756.     }
  1757. }
  1758.  
  1759. GEN divrr(x,y)
  1760.      GEN x,y;
  1761. {
  1762.   long sx=signe(x),sy=signe(y),lx,ly,lz,ex,ex1,i,z0;
  1763.   long ldif,y0,y1,si,saux,qp,k,k1,k3,k4,j,flk4;
  1764.   GEN z;
  1765.   
  1766.   if(!sy) err(diver9);
  1767.   ex=expo(x)-expo(y)+0x800000;
  1768.   if(ex<=0) err(diver10);
  1769.   if(ex>=0x1000000) err(diver11);
  1770.   if(!sx)
  1771.     {
  1772.       z=cgetr(3);z[1]=ex;z[2]=0;return z;
  1773.     }
  1774.   lx=lg(x);ly=lg(y);lz=(lx<=ly)?lx:ly;
  1775.   z=cgetr(lz);if(sy<0) sx= -sx;
  1776.   ex1=(sx<<24)+ex;
  1777.   if(ly==3)
  1778.     {
  1779.       i=x[2];si=(lx>3)?x[3]:0;
  1780.       if((ulong)i<(ulong)y[2])
  1781.     {
  1782.       hiremainder=i;z[2]=divll(si,y[2]);
  1783.       z[1]=ex1-1;return z;
  1784.     }
  1785.       else
  1786.     {
  1787.       hiremainder=((ulong)i)>>1;
  1788.       z[2]=(i&1)?divll((((ulong)si)>>1)|(0x80000000),y[2]):divll(((ulong)si)>>1,y[2]);
  1789.       z[1]=ex1;return z;
  1790.     }
  1791.     }
  1792.   z0= *z;*z=0;
  1793.   for(i=2;i<=lz-1;i++) z[i-1]=x[i];
  1794.   z[lz-1]=(lx>lz) ? x[lz] : 0;
  1795.   ldif=ly-lz;if(!ldif) {y0=y[lz];y[lz]=0;}
  1796.   if(ldif<=1) {y1=y[lz+1];y[lz+1]=0;}
  1797.   si=y[2];saux=y[3];
  1798.   for(i=0;i<lz-1;i++)
  1799.     {
  1800.       if(z[i]==si) 
  1801.     {
  1802.       qp=0xffffffff;k=addll(si,z[i+1]);
  1803.     }
  1804.       else
  1805.     {
  1806.       hiremainder=z[i];qp=divll(z[i+1],si);
  1807.       overflow=0;k=hiremainder;
  1808.     }
  1809.       if(!overflow)
  1810.     {
  1811.       k1=mulll(qp,saux);k3=subll(k1,z[i+2]);k+=overflow;
  1812.       flk4=((ulong)hiremainder>(ulong)k);k4=subll(hiremainder,k);
  1813.       while(flk4) {qp--;k3=subll(k3,saux);k4-=overflow;flk4=((ulong)k4>(ulong)si);k4=subll(k4,si);}
  1814.     }
  1815.       mulll(qp,y[lz+1-i]);
  1816.       for(j=lz-i;j>=2;j--)
  1817.     {
  1818.       k1=addmul(qp,y[j]);
  1819.       z[i+j-1]=subll(z[i+j-1],k1);hiremainder+=overflow;
  1820.     }
  1821.       if((ulong)z[i]<(ulong)hiremainder)
  1822.     {
  1823.       overflow=0;qp--;
  1824.       for(j=lz-i;j>=2;j--) z[i+j-1]=addllx(z[i+j-1],y[j]);
  1825.     }
  1826.       z[i]=qp;
  1827.     }
  1828.   if(!ldif) y[lz]=y0;if(ldif<=1) y[lz+1]=y1;
  1829.   for(j=lz-1;j>=2;j--) z[j]=z[j-1];
  1830.   if(*z)
  1831.     {
  1832.       k=0x80000000;
  1833.       for(j=2;j<lz;j++) {z[j]=shiftlr(z[j],1)+k;k=hiremainder;}
  1834.     }
  1835.   else ex1--;
  1836.   z[1]=ex1;*z=z0;return z;
  1837. }
  1838.  
  1839.   
  1840. GEN gerepile(l,p,q)
  1841.     GEN l,p,q;
  1842.  
  1843. {
  1844.   long av,declg,tl;
  1845.   GEN ll,pp,l1,l2,l3;
  1846.  
  1847.   declg=(long)l-(long)p;if(declg<=0) return q;
  1848.   for(ll=l,pp=p;pp>(GEN)avma;) *--ll= *--pp;
  1849.   av=(long)ll;
  1850.   while((ll<l)||((ll==l)&&(long)q))
  1851.   {
  1852.     l2=ll+lontyp[tl=typ(ll)];
  1853.     if(tl==10) {l3=ll+lgef(ll);ll+=lg(ll);if(l3>ll) l3=l2;}
  1854.     else {ll+=lg(ll);l3=ll;} 
  1855.     for(;l2<l3;l2++) 
  1856.       {
  1857.     l1=(GEN)(*l2);
  1858.     if((l1<l)&&(l1>=(GEN)avma))
  1859.       {
  1860.         if(l1<p) *l2+=declg;
  1861.         else
  1862.           if(ll<=l) err(gerper);
  1863.       }
  1864.       }
  1865.   }
  1866.   if((!((long)q))||((q<p)&&(q>=(GEN)avma)))
  1867.   {
  1868.     avma=av;return q+(declg>>2);
  1869.   }
  1870.   else {avma=av;return q;}
  1871. }
  1872.  
  1873. void cgiv(x)
  1874.      GEN x;
  1875. {
  1876.   long p;
  1877.  
  1878.   if((p=pere(x))==255) return;
  1879.   if((x!=(GEN)avma)||(p>1)) {setpere(x,p-1);return;}
  1880.   do x+=lg(x);while(!pere(x));
  1881.   avma=(long)x;
  1882.   return;
  1883. }
  1884.